package com.zx.notification.common.utils;

import com.zx.common.tools.id.components.IdGeneratorComponent;
import com.zx.common.tools.utils.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 通知编号生成工具类
 * 使用ID生成器组件生成全局唯一的任务编号
 */
@Slf4j
@Component
public class NotificationNoUtils {

    private static IdGeneratorComponent idGeneratorComponent;

    /**
     * 获取ID生成器组件实例
     * 延迟初始化，避免在Spring上下文未准备好时就尝试获取Bean
     *
     * @return IdGeneratorComponent实例
     */
    private static IdGeneratorComponent getIdGeneratorComponent() {
        if (idGeneratorComponent == null) {
            idGeneratorComponent = SpringContextUtil.getBean(IdGeneratorComponent.class);
        }
        return idGeneratorComponent;
    }

    /**
     * 生成通知id
     * 为避免ID过长，当使用UUID策略时直接使用ID，不添加前缀
     *
     * @return 通知编号
     */
    public static String generateNotificationId() {
        try {
            String notificationNo = getIdGeneratorComponent().generateId();
            // 如果是纯数字ID（雪花算法），则添加NOTIFY前缀
            if (notificationNo.matches("\\d+")) {
                notificationNo = "NOTIFY" + notificationNo;
            }
            // 如果是UUID，则直接使用，避免ID过长
            log.debug("Generated notification number: {}", notificationNo);
            return notificationNo;
        } catch (Exception e) {
            log.error("Failed to generate notification number", e);
            throw new RuntimeException("Failed to generate notification number", e);
        }
    }

    /**
     * 生成带日期的通知编号（可选）
     * 格式：NOTIFY + 年月日 + ID生成器生成的ID
     *
     * @return 通知编号
     */
    public static String generateNotificationNoWithDate() {
        try {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
            String dateStr = LocalDateTime.now().format(formatter);
            String notificationNo = getIdGeneratorComponent().generateId();
            // 如果是纯数字ID（雪花算法），则添加NOTIFY前缀和日期
            if (notificationNo.matches("\\d+")) {
                notificationNo = "NOTIFY" + dateStr + notificationNo;
            } else {
                // 如果是UUID，则只添加NOTIFY前缀和日期
                notificationNo = "NOTIFY" + dateStr + notificationNo;
            }
            log.debug("Generated notification number with date: {}", notificationNo);
            return notificationNo;
        } catch (Exception e) {
            log.error("Failed to generate notification number with date", e);
            throw new RuntimeException("Failed to generate notification number with date", e);
        }
    }

    public static void main(String[] args) {
        // 测试生成通知编号
        for (int i = 0; i < 5; i++) {
            System.out.println("NotificationNo " + (i + 1) + ": " + generateNotificationId());
        }

        System.out.println("-------------------");

        // 测试生成带日期的通知编号
        for (int i = 0; i < 5; i++) {
            System.out.println("NotificationNoWithDate " + (i + 1) + ": " + generateNotificationNoWithDate());
        }
    }
}